﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.OleDb;

namespace FlyShop
{
    public partial class FrmCadastroPromocao : Form
    {

        // Indica se o formulário está em modo de edição de registro
        public bool edicao;
        // Código do registro a ser alterado
        public int codPromocao;

        OleDbConnection conexao;
        OleDbCommand comando;
        OleDbDataReader dr;
        OleDbParameter pCod, pNome, pDesc, pAtivo, pVlrDesconto;

        String strConexao = "Provider=MSDAORA.1;Data Source=localhost;Persist Security Info=True;User ID=pi;Password=pi";
        String sqlInsere = "insert into promocao (cod_promocao, nome, descricao, flag_ativo, desconto) values ((select nvl(max(cod_promocao), 0) + 1 from promocao), ?, ?, ?, ?)";
        String sqlConsulta = "select * from promocao where cod_promocao = ?";
        String sqlUpdate = "update promocao set nome = ?, descricao = ?, flag_ativo = ?, desconto = ? where cod_promocao = ?";

        public FrmCadastroPromocao()
        {
            InitializeComponent();
        }

        private void FrmCadastroPromocao_Load(object sender, EventArgs e)
        {
            conexao = new OleDbConnection(strConexao);
            conexao.Open();

            // Se estiver em modo edição, recupera o registro
            // no banco e mostra-o no formulário
            if (edicao) {

                comando = new OleDbCommand(sqlConsulta, conexao);

                pCod = new OleDbParameter("cod_promocao", OleDbType.Integer);
                pCod.Value = codPromocao;
                comando.Parameters.Add(pCod);

                dr = comando.ExecuteReader();

                if (dr.Read())
                {
                    txtNome.Text = dr["nome"].ToString();
                    txtDescricao.Text = dr["descricao"].ToString();
                    // É preciso adequar o valor à mascara do campo
                    txtValorDesconto.Text = String.Format("{0:000.00}",
                        Double.Parse(dr["desconto"].ToString()));

                    char ativo = Char.Parse(dr["flag_ativo"].ToString());
                    if (ativo == 's')
                    {
                        ckbAtivo.Checked = true;
                    }
                    else
                    {
                        ckbAtivo.Checked = false;
                    }
                }
                else
                {
                    MessageBox.Show("Erro - Edição?");
                    this.Close();   
                }

            } 
        }

        private void btnSalvar_Click(object sender, EventArgs e)
        {

            if (valida()) 
            {

                // Cria o comando de acordo o estado do formulário
                if (edicao)
                {
                    comando = new OleDbCommand(sqlUpdate, conexao);

                    // Parâmetros
                    pNome = new OleDbParameter("nome", OleDbType.VarChar);
                    pNome.Value = txtNome.Text.Trim();
                    comando.Parameters.Add(pNome);

                    pDesc = new OleDbParameter("descricao", OleDbType.VarChar);
                    pDesc.Value = txtDescricao.Text.Trim();
                    comando.Parameters.Add(pDesc);

                    pAtivo = new OleDbParameter("flag_ativo", OleDbType.Char);
                    if (ckbAtivo.Checked)
                    {
                        pAtivo.Value = 's';
                    }
                    else
                    {
                        pAtivo.Value = 'n';
                    }
                    comando.Parameters.Add(pAtivo);

                    // Atenção especial ao valor
                    // Precisa ser formatado antes de persistir no banco
                    String valorTexto = txtValorDesconto.Text.Trim();
                    String valorParteDecimalTexto = valorTexto.Substring(valorTexto.Length - 2, 2);
                    String valorParteInteiraTexto = valorTexto.Substring(0, valorTexto.Length - 2);
                    double valor = Double.Parse(valorParteInteiraTexto + "," + valorParteDecimalTexto);
                    pVlrDesconto = new OleDbParameter("desconto", OleDbType.Decimal);
                    pVlrDesconto.Value = valor;
                    comando.Parameters.Add(pVlrDesconto);

                    pCod = new OleDbParameter("cod_promocao", OleDbType.Integer);
                    pCod.Value = codPromocao;
                    comando.Parameters.Add(pCod);

                    // Update
                    comando.ExecuteNonQuery();

                    // Fecha o formulário quando é edição
                    this.Close();
                }
                else
                {
                    
                    comando = new OleDbCommand(sqlInsere, conexao);
                    
                    // Parâmetros
                    pNome = new OleDbParameter("nome", OleDbType.VarChar);
                    pNome.Value = txtNome.Text.Trim();
                    comando.Parameters.Add(pNome);

                    pDesc = new OleDbParameter("descricao", OleDbType.VarChar);
                    pDesc.Value = txtDescricao.Text.Trim();
                    comando.Parameters.Add(pDesc);

                    pAtivo = new OleDbParameter("flag_ativo", OleDbType.Char);
                    if (ckbAtivo.Checked)
                    {
                        pAtivo.Value = 's';
                    }
                    else 
                    {
                        pAtivo.Value = 'n';
                    }
                    comando.Parameters.Add(pAtivo);

                    // Atenção especial ao valor
                    // Precisa ser formatado antes de persistir no banco
                    String valorTexto = txtValorDesconto.Text.Trim();
                    String valorParteDecimalTexto = valorTexto.Substring(valorTexto.Length - 2, 2);
                    String valorParteInteiraTexto = valorTexto.Substring(0, valorTexto.Length - 2);
                    double valor = Double.Parse(valorParteInteiraTexto + "," + valorParteDecimalTexto);
                    pVlrDesconto = new OleDbParameter("desconto", OleDbType.Decimal);
                    pVlrDesconto.Value = valor;
                    comando.Parameters.Add(pVlrDesconto);

                    // Insert
                    comando.ExecuteNonQuery();


                    // Verifica se o usuário deseja inserir um novo registro
                    DialogResult resultado = MessageBox.Show(this,
                                                           "Cadastrado com sucesso.\nDeseja cadastrar outro registro?",
                                                           "Cadastro",
                                                            MessageBoxButtons.YesNo);

                    if (resultado == DialogResult.Yes)
                    {
                        // Limpa os campos
                        txtNome.Clear();
                        txtDescricao.Clear();
                        txtValorDesconto.Clear();
                        ckbAtivo.Checked = true;
                    }
                    else
                    {
                        this.Close();
                    }
                }
            }

        }

        public bool valida() 
        {

            if (txtNome.Text.Trim().Length < 3) 
            {
                MessageBox.Show(this, "Preencha o nome corretamente.", "Validação", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                txtNome.BackColor = Color.Tomato;
                return false;
            }
            else
                txtNome.BackColor = Color.White;

            if (txtDescricao.Text.Trim().Length > 2000)
            {
                MessageBox.Show(this, "Preencha a descrição corretamente.", "Validação", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                txtDescricao.BackColor = Color.Tomato;
                return false;
            }
            else
                txtDescricao.BackColor = Color.White;

            // Atenção especial ao valor
            // Precisa ser formatado para conseguir o valor real
            String valorTexto = txtValorDesconto.Text.Trim();
            String valorParteDecimalTexto = valorTexto.Substring(valorTexto.Length - 2, 2);
            String valorParteInteiraTexto = valorTexto.Substring(0, valorTexto.Length - 2);
            double valor = Double.Parse(valorParteInteiraTexto + "," + valorParteDecimalTexto);

            if (valor < 0) 
            {
                MessageBox.Show(this, "Preencha o desconto corretamente. Min: 0.00, Máx: 999.00",
                    "Validação", MessageBoxButtons.OK);
                txtValorDesconto.Focus();
                txtValorDesconto.BackColor = Color.Tomato;
                return false;
            }
            else
                txtValorDesconto.BackColor = Color.White;

            // Se chegar aqui validou
            return true;
        }

        private void FrmCadastroPromocao_FormClosed(object sender, FormClosedEventArgs e)
        {
            conexao.Close();
        }
     
        private void txtValorDesconto_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == 13)
                btnSalvar_Click(sender, e);
        }

        private void FrmCadastroPromocao_KeyDown(object sender, KeyEventArgs e)
        {
            //Hotkey para salvar os dados
            if (e.KeyData == (Keys.Control | Keys.S))
            {
                btnSalvar_Click(sender, e);
            }

            //Hotkey para a tecla ESC fechar a janela
            if (e.KeyData == (Keys.Escape))
            {
                this.Close();
            }
        }
    }
}
